extensions: add more u32 short cut utility conversions
authorØyvind Kolås <pippin@gimp.org>
Sat, 7 Apr 2018 15:04:56 +0000 (17:04 +0200)
committerØyvind Kolås <pippin@gimp.org>
Sat, 7 Apr 2018 15:08:01 +0000 (17:08 +0200)
extensions/32bit.c

index 431b84422549de3ff0a1d124c3fbf1f5d09ee41c..e5e3f640529395978ed6b35ca12328614455c4b3 100644 (file)
 #include "extensions/util.h"
 
 static inline void
-conv_rgbu32_rgbu16 (const Babl    *conversion,
-                    unsigned char *src,
-                    unsigned char *dst,
-                    long           samples)
+conv_u32_u16 (const Babl    *conversion,
+              unsigned char *src,
+              unsigned char *dst,
+              long           samples)
 
 
 {
   uint32_t *src32 = (uint32_t*) src;
   uint16_t *dst16 = (uint16_t*) dst;
-  long n = samples * 3;
+  long n = samples;
 
   while (n--)
     {
@@ -44,16 +44,16 @@ conv_rgbu32_rgbu16 (const Babl    *conversion,
 }
 
 static inline void
-conv_rgbu16_rgbu32 (const Babl    *conversion,
-                    unsigned char *src,
-                    unsigned char *dst,
-                    long           samples)
+conv_u16_u32 (const Babl    *conversion,
+              unsigned char *src,
+              unsigned char *dst,
+              long           samples)
 
 
 {
   uint16_t *src16 = (uint16_t*) src;
   uint32_t *dst32 = (uint32_t*) dst;
-  long n = samples * 3;
+  long n = samples;
 
   while (n--)
     {
@@ -62,6 +62,51 @@ conv_rgbu16_rgbu32 (const Babl    *conversion,
 }
 
 
+static inline void
+conv_yau32_yau16 (const Babl    *conversion,
+                    unsigned char *src,
+                    unsigned char *dst,
+                    long           samples)
+
+
+{
+  conv_u32_u16 (conversion, src, dst, samples * 2);
+}
+
+static inline void
+conv_rgbu32_rgbu16 (const Babl    *conversion,
+                    unsigned char *src,
+                    unsigned char *dst,
+                    long           samples)
+
+
+{
+  conv_u32_u16 (conversion, src, dst, samples * 3);
+}
+
+static inline void
+conv_rgbu16_rgbu32 (const Babl    *conversion,
+                    unsigned char *src,
+                    unsigned char *dst,
+                    long           samples)
+
+
+{
+  conv_u16_u32 (conversion, src, dst, samples * 3);
+}
+
+static inline void
+conv_yau16_yau32 (const Babl    *conversion,
+                    unsigned char *src,
+                    unsigned char *dst,
+                    long           samples)
+
+
+{
+  conv_u16_u32 (conversion, src, dst, samples * 2);
+}
+
+
 static inline void
 conv_rgbau32_rgbau16 (const Babl    *conversion,
                       unsigned char *src,
@@ -70,14 +115,7 @@ conv_rgbau32_rgbau16 (const Babl    *conversion,
 
 
 {
-  uint32_t *src32 = (uint32_t*) src;
-  uint16_t *dst16 = (uint16_t*) dst;
-  long n = samples * 4;
-
-  while (n--)
-    {
-      *dst16++ = (*src32++)>>16;
-    }
+  conv_u32_u16 (conversion, src, dst, samples * 4);
 }
 
 static inline void
@@ -88,14 +126,7 @@ conv_rgbau16_rgbau32 (const Babl    *conversion,
 
 
 {
-  uint16_t *src16 = (uint16_t*) src;
-  uint32_t *dst32 = (uint32_t*) dst;
-  long n = samples * 4;
-
-  while (n--)
-    {
-      *dst32++ = (*src16++) * 65536.99f;
-    }
+  conv_u16_u32 (conversion, src, dst, samples * 4);
 }
 
 
@@ -136,6 +167,25 @@ conv_rgb32_rgba32 (const Babl *conversion,unsigned char *src,
     }
 }
 
+
+static inline void
+conv_yu32_yau32 (const Babl *conversion,unsigned char *src,
+                 unsigned char *dst,
+                 long           samples)
+{
+  uint32_t *src32 = (uint32_t*) src;
+  uint32_t *dst32 = (uint32_t*) dst;
+  long n = samples;
+
+  while (n--)
+    {
+      *dst32++ = (*src32++);
+      *dst32++ = 4294967295;
+    }
+}
+
+
+
 int init (void);
 
 int
@@ -171,7 +221,6 @@ init (void)
     "linear",
     conv_rgbu16_rgbu32,
     NULL);
-
   babl_conversion_new (
     babl_format ("RGBA u32"),
     babl_format ("RGBA u16"),
@@ -197,7 +246,6 @@ init (void)
     "linear",
     conv_rgbau16_rgbau32,
     NULL);
-
   babl_conversion_new (
     babl_format ("RGBA u32"),
     babl_format ("RGB u32"),
@@ -223,5 +271,106 @@ init (void)
     conv_rgb32_rgba32,
     NULL);
 
+  babl_conversion_new (
+    babl_format ("Y u32"),
+    babl_format ("Y u16"),
+    "linear",
+    conv_u32_u16,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y' u32"),
+    babl_format ("Y' u16"),
+    "linear",
+    conv_u32_u16,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y u16"),
+    babl_format ("Y u32"),
+    "linear",
+    conv_u16_u32,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y' u16"),
+    babl_format ("Y' u32"),
+    "linear",
+    conv_u16_u32,
+    NULL);
+
+
+  babl_conversion_new (
+    babl_format ("YA u32"),
+    babl_format ("YA u16"),
+    "linear",
+    conv_yau32_yau16,
+    NULL);
+  babl_conversion_new (
+    babl_format ("YaA u32"),
+    babl_format ("YaA u16"),
+    "linear",
+    conv_yau32_yau16,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y'A u32"),
+    babl_format ("Y'A u16"),
+    "linear",
+    conv_yau32_yau16,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y'aA u32"),
+    babl_format ("Y'aA u16"),
+    "linear",
+    conv_yau32_yau16,
+    NULL);
+  babl_conversion_new (
+    babl_format ("YA u16"),
+    babl_format ("YA u32"),
+    "linear",
+    conv_yau16_yau32,
+    NULL);
+  babl_conversion_new (
+    babl_format ("YaA u16"),
+    babl_format ("YaA u32"),
+    "linear",
+    conv_yau16_yau32,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y'A u16"),
+    babl_format ("Y'A u32"),
+    "linear",
+    conv_yau16_yau32,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y'aA u16"),
+    babl_format ("Y'aA u32"),
+    "linear",
+    conv_yau16_yau32,
+    NULL);
+
+
+  babl_conversion_new (
+    babl_format ("Y u32"),
+    babl_format ("YA u32"),
+    "linear",
+    conv_yu32_yau32,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y u32"),
+    babl_format ("YaA u32"),
+    "linear",
+    conv_yu32_yau32,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y' u32"),
+    babl_format ("Y'A u32"),
+    "linear",
+    conv_yu32_yau32,
+    NULL);
+  babl_conversion_new (
+    babl_format ("Y' u32"),
+    babl_format ("Y'aA u32"),
+    "linear",
+    conv_yu32_yau32,
+    NULL);
+
   return 0;
 }